#include "stdio.h"
#include "stdarg.h"
#include "user_usart.h"
#include "./lw_queue/lw_queue.h"
#include "./letter_shell/letter_shell_porting.h"

/********************静态变量定义********************/


/********************全局函数定义********************/

/**
 * @brief	串口发送
 * @param	uart 串口句柄
 * @param	pData 数据指针
 * @param	Size 数据大小
 * @return
 */
void DL_UART_Transmit(UART_Regs *uart, const uint8_t *pData, uint16_t Size)
{
	for(uint16_t i = 0; i < Size; i++)
	{
		while( DL_UART_isBusy(uart) == true );
		DL_UART_Main_transmitData(uart, *pData);
		pData++;
	}
}

/**
 * @brief	调试串口的接收中断回调
 * @param
 * @return
 */
void debug_usart_rec_handler(void)
{
	if(DL_UART_getPendingInterrupt(DEBUG_USART_INST) == DL_UART_IIDX_RX)
	{
		uint8_t rec_data;
		rec_data = DL_UART_Main_receiveData(DEBUG_USART_INST); /*从串口接收数据*/
		lwq_write(&debug_data_que, &rec_data); /*发送队列*/	
	}
}

/**
 * @brief	开启调试串口的中断接收
 * @param
 * @return
 */
void debug_usart_rec_start(void)
{	  
    NVIC_ClearPendingIRQ(DEBUG_USART_INST_INT_IRQN); /*清除串口中断标志*/   
    NVIC_EnableIRQ(DEBUG_USART_INST_INT_IRQN); /*使能串口中断*/
}

/**
 * @brief	格式化输出
 * @param
 * @return
 */
int debug_printf(const char *format, ...)
{
    char buffer[128]; /*定义一个缓冲区，用于存储格式化后的字符串*/
    va_list arg;      /* 定义一个可变参数列表*/
    int len;          /* 定义一个变量，用于存储格式化后字符串的长度*/
    
    va_start(arg, format);/* 初始化可变参数列表，指向第一个可变参数*/
	
    /* 使用 vsnprintf 函数将格式化字符串写入缓冲区*/
    /* vsnprintf 返回格式化后字符串的长度*/
    len = vsnprintf(buffer, sizeof(buffer), format, arg);
   
    va_end(arg); /* 清理可变参数列表*/

    DL_UART_Transmit(DEBUG_PID_INST, (uint8_t *)buffer, (uint16_t)len);

    return len;
}